/*!
* 文件名     main.c
* 作者       聚沃科技
* 版本       V1.0
* 实验简介   EXMC-外部SRAM读写实验
*/

/*
* 版权说明
* 本程序只供学习使用，未经作者许可，不得用于其它任何用途
* GD32F303东方红开发板V1
* 在线购买：   http://juwo.taobao.com
* 技术交流：   http://www.gd32bbs.com/ask/
* 视频学习：   https://space.bilibili.com/475462605
* 微信公众号： gd32bbs
* 创建日期:    2023/8/30
* Copyright    苏州聚沃电子科技有限公司
* 版权所有，盗版必究。
*/

#include "app_nand_flash.h"

#include "bsp_led.h"
#include "bsp_uart.h"
#include "bsp_spi_nand.h"
#include "driver_public.h"

#include "bsp_lcd.h"

#include "FreeRTOS.h"
#include "task.h"


//读写校验长度
#define BUFFER_SIZE                    SPI_NAND_PAGE_SIZE+SPI_NAND_SPARE_AREA_SIZE

//demo写入地址
#define  FLASH_WRITE_ADDRESS           0x000000
#define  FLASH_READ_ADDRESS            FLASH_WRITE_ADDRESS

/*!
    \brief      init task
    \param[in]  pvParameters not used
    \param[out] none
    \retval     none
*/
Drv_Err nand_flash_test(void)
{   
    uint32_t flash_id;
    uint8_t *tx_buffer,*rx_buffer;    
    
    tx_buffer=pvPortMalloc(2048);
    rx_buffer=pvPortMalloc(2048);

    vPortFree(tx_buffer);
    vPortFree(rx_buffer);    
    
    //读取flash id
    flash_id = bsp_spi_nandflash_read_id();

    //比对flash id是否一致
    if(NAND_ID == flash_id)
    {
        tx_buffer=pvPortMalloc(BUFFER_SIZE);
        rx_buffer=pvPortMalloc(BUFFER_SIZE);
        if(tx_buffer!=NULL && rx_buffer!=NULL)
        {
            //准备数据
            for(uint16_t i = 0; i < BUFFER_SIZE; i ++){
                tx_buffer[i] = i;
            }
        }else{
            vPortFree(tx_buffer); 
            vPortFree(rx_buffer);             
            return DRV_ERROR;
        }
        
        //擦除要写入的block        
        bsp_nandflash_block_erase(0);
        //写入数据         
        bsp_nandflash_page_program((uint8_t*)tx_buffer,0,0,0);

        //回读写入数据
        bsp_nandflash_page_read(rx_buffer,0,0);  
        

        //比较回读和写入数据
        if(DRV_ERROR == memory_compare(tx_buffer,rx_buffer,BUFFER_SIZE)){
            vPortFree(tx_buffer); 
            vPortFree(rx_buffer);            
            return DRV_ERROR;
        }else{
            vPortFree(tx_buffer); 
            vPortFree(rx_buffer);
            return DRV_SUCCESS;            
        }
    }else{ //ID读取错误
        /* spi flash read id fail */
        return DRV_ERROR;
    }
}

///*!
//    \brief      init task
//    \param[in]  pvParameters not used
//    \param[out] none
//    \retval     none
//*/
//Drv_Err nand_flash_test(void)
//{   
//    uint32_t flash_id;
//    uint8_t *tx_buffer,*rx_buffer;    
//    printf_log("\n\rSPI NAND Flash:GD5F1G test:\n\r");
//    
//    tx_buffer=pvPortMalloc(2048);
//    rx_buffer=pvPortMalloc(2048);

//    vPortFree(tx_buffer);
//    vPortFree(rx_buffer);    

//    //初始化SPI NAND         
//    bsp_spi_nand_init();
//    
//    //读取flash id
//    flash_id = bsp_spi_nandflash_read_id();
//    printf_log("The Flash_ID:0x%X;\n\r",flash_id);

//    //比对flash id是否一致
//    if(NAND_ID == flash_id)
//    {
//        tx_buffer=pvPortMalloc(BUFFER_SIZE);
//        rx_buffer=pvPortMalloc(BUFFER_SIZE);
//        if(tx_buffer!=NULL && rx_buffer!=NULL)
//        {
//            //准备数据
//            for(uint16_t i = 0; i < BUFFER_SIZE; i ++){
//                tx_buffer[i] = i;
//            }
//        }else{
//            printf_log("malloc fail!\n\r");
//            vPortFree(tx_buffer); 
//            vPortFree(rx_buffer);             
//            return DRV_ERROR;
//        }
//        
//        //擦除要写入的block        
//        bsp_nandflash_block_erase(0);
//        //写入数据         
//        bsp_nandflash_page_program((uint8_t*)tx_buffer,0,0,0);

//        //回读写入数据
//        bsp_nandflash_page_read(rx_buffer,0,0);  
//        

//        //比较回读和写入数据
//        if(DRV_ERROR == memory_compare(tx_buffer,rx_buffer,BUFFER_SIZE)){
//            printf_log("Err:Data Read and Write aren't Matching!\n\r");
//            vPortFree(tx_buffer); 
//            vPortFree(rx_buffer);            
//            return DRV_ERROR;
//        }else{
//            printf_log("NAND flash Test Passed!\n\r");
//            vPortFree(tx_buffer); 
//            vPortFree(rx_buffer);
//            return DRV_SUCCESS;            
//        }
//    }else{ //ID读取错误
//        /* spi flash read id fail */
//        printf_log("Err The Flash_ID :0x%X!\n\r",flash_id);
//        return DRV_ERROR;
//    }
//}

/*!
* 说明     main函数
* 输入     无
* 输出     无
* 返回值   无
*/
void nand_flash_task(void * pvParameters)
{    
    //重新设置新的打印窗口
    bsp_lcd_printf_init(0,370,bsp_lcd_parameter.width-1,bsp_lcd_parameter.height-1,FONT_ASCII_12_6,BLUE,~BLUE);

    while (1)
    {    
        nand_flash_test();
        vTaskDelay(1000);                                                  
    }
}

